// 常用的构造函数

/* 
  1.类名构造函数
  2.命名构造函数
  3.工厂构造函数
 */

void main() {
  Person p = Person('坤坤', 18);
  p.say();

  Student s = Student.widthName('kunkun'); // 我是kunkun，今年null岁~
  Student s2 = Student.widthAge(18); // 我是null，今年18岁~
  s.say();
  s2.say();

  Person2 p2 = Person2.withInfo('ikun', -1);
  p2.say();
}

// 类名构造函数
class Person {
  String? name;
  int? age;

  // 类名构造函数
  // Person(String name, int age) {
  //   this.name = name;
  //   this.age = age;
  // }

  // 简写形式：函数参数与类属性同名可以简写
  Person(this.name, this.age);

  void say() {
    print('我是${this.name}，今年${this.age}岁~');
  }
}

// 命名构造函数：可以为类提供多个不同的构造函数
// 定义方式：类名.函数名(){}
class Student {
  String? name;
  int? age;

  // 简写
  Student.widthName(this.name);
  Student.widthAge(this.age);

  void say() {
    print('我是${this.name}，今年${this.age}岁~');
  }
}

// 工厂构造函数

class Person2 {
  String? name;
  int? age;

  Person2(this.name, this.age);

  // 工厂构造函数
  factory Person2.withInfo(String name, int age) {
    // 需要手动创建对象并返回
    return age < 0 ? Person2(name, 0) : Person2(name, age);
  }

  void say() {
    print('我是${this.name}，今年${this.age}岁~');
  }
}
